class WebSocket {//使用es语法封装Websocket供自己使用
	constructor(url) { //new 实例时初始化数据用
		this.scoketTask = null
		this.timeoutObj = null
		this.serverTimeoutObj = null
		this.timeout = 5000//websocket大约6feng'zon
		this.lockReconnect = false
		this.createWebSocket(url)
	}
	createWebSocket(url) {
		try {
			this.connectSocket(url)
		} catch (e) {
			this.reconnect(url);
			console.log(e);
		}
	}
	//重连
	//设置节流，避免重复连接websocket
	reconnect(url) {
		if (this.lockReconnect) return;
		this.lockReconnect = true;
		setTimeout(() => { //没连接上会一直重连，设置延迟避免请求过多
			this.createWebSocket(url);
			this.lockReconnect = false;
		}, 2000);
	}
	//错误写法，当你调用 this.socketTask.send("ping") 发送字符串 "ping" 时，它无法起作用是因为 this.socketTask.send() 方法通常用于发送 WebSocket 数据帧（frame），而不是普通的字符串消息。
	//心跳检测
	startHeart() {
		clearTimeout(this.timeoutObj);
		clearTimeout(this.serverTimeoutObj);
		this.timeoutObj = setTimeout(() => {
			//这里发送一个心跳，后端收到后，返回一个心跳消息，
			//onmessage拿到返回的心跳就说明连接正常
			this.send("ping");
			console.log("ping!")
			this.serverTimeoutObj = setTimeout(() => { //如果超过一定时间还没重置，说明后端主动断开了
				this.scoketTask
					.close(); //如果onclose会执行reconnect，我们执行this.scoketTask.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
			}, this.timeout)
		}, this.timeout)
	}
	//发送消息
	send(val) {
		this.scoketTask.send({
			data: JSON.stringify(val), //data只能发送字符串
			success(res) {
				console.log('发送成功', res)
			},
			fail(err) {
				console.log('发送失败', err)
			}
		});
	}
	//连接websocket
	connectSocket(url) {
		this.scoketTask = uni.connectSocket({ //192.168.31.156自己,192.168.1.18
			url,
			success(res) { //这里不是连接成功，而是这个api方法调用成功，真他妈的坑啊
				console.log("api方法调用成功", res)
			},
			header: {
				'content-type': 'application/json'
			}
		})
		//监听webscoket是否已打开
		this.scoketTask.onOpen((res) => { //这里才能知道websocket是否打开了。注意了
			console.log(res, "websocket打开了")

			this.startHeart()
			// this.connectionStatus = true
		})
		//接收内容
		this.scoketTask.onMessage((res) => {
			console.log(res)

			// this.clearTime()
			this.startHeart()

		});

		//监听WebSocket连接打开失败,其实监听了服务器自己断开事件，我们主动再次发起连接
		this.scoketTask.onError((res) => {
			console.log('WebSocket连接打开失败，请检查！');
			this.reconnect(url)

		})
		// // 监听连接关闭 -因该是客户端主动关闭
		this.scoketTask.onClose((e) => {
			console.log('WebSocket连接关闭！');
		})

	}
}
module.exports = WebSocket